package com.fingard.util;

import java.util.ArrayList;
import java.util.Map;
import java.util.TreeMap;

public class SortHelper {
	
	/**对字符串数组进行冒泡排序*/
	public static String[] BubbleSort(String[] r)
    {
        int i, j; //交换标志 
        String temp;
        boolean exchange;

        for (i = 0; i < r.length; i++){//最多做R.Length-1趟排序 
            exchange = false; //本趟排序开始前，交换标志应为假
            for (j = r.length - 2; j >= i; j--){
                if (r[j + 1].compareTo(r[j]) < 0){//交换条件
                    temp = r[j + 1];
                    r[j + 1] = r[j];
                    r[j] = temp;
                    exchange = true; //发生了交换，故将交换标志置为真 
                }
            }

            if (!exchange){//本趟排序未发生交换，提前终止算法 
                break;
            }
        }
        return r;
    }
	/**
	 * 通过默认的字典排序
	 * @param map
	 * @return
	 */
	public static <K,V> Map<K,V> sortMapByName(Map<K,V> map){
		TreeMap<K, V> treeMap=new TreeMap<K, V>(map);
		return (Map<K, V>)treeMap;
	}
	
	/**排序，升序/顺序，从小到大，返回数据的索引
	 * 注意：只返回排完序的索引*/
	public static int[] bubbleSortRetIdxAsc(ArrayList<Integer> pValues)
    {
		return bubbleSortRetIdx(pValues, false);
    }
	
	/**排序，倒序/逆序，从大到小，返回数据的索引
	 * 注意：只返回排完序的索引*/
	public static int[] bubbleSortRetIdxDesc(ArrayList<Integer> pValues)
    {
		return bubbleSortRetIdx(pValues, true);
    }
	
	/**排序，倒序，从大到小，返回数据的索引
	 * 注意：只返回排完序的索引
	 * @param pDesc 是否倒序，true为倒序，从大到小排*/
    public static int[] bubbleSortRetIdx(ArrayList<Integer> pValues, boolean pDesc)
    {
        int[] retIdx = new int[pValues.size()];
        for (int i = 0; i < retIdx.length; i++){
            retIdx[i] = i;
        }
        boolean hasChange = true;
        while (hasChange){
            hasChange = false;
            for (int i = 0; i < retIdx.length-1; i++){
            	if(pDesc){
            		if (pValues.get(retIdx[i]) < pValues.get(retIdx[i + 1])){
            			hasChange = true;
                    }
            	}else{
            		if (pValues.get(retIdx[i]) > pValues.get(retIdx[i + 1])){
            			hasChange = true;
                    }
            	}
                if (hasChange){
                    int chgVal = retIdx[i];
                    retIdx[i] = retIdx[i + 1];
                    retIdx[i + 1] = chgVal;
                }
            }
        }
        return retIdx;
    }
}
